home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1996 March / macformat-035.iso / Shareware City / Developers / ICAppSourceKit1.2 / ICFontWhats.p < prev    next >
Encoding:
Text File  |  1995-11-07  |  8.3 KB  |  282 lines  |  [TEXT/CWIE]

  1. unit ICFontWhats;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICWindowGlobals;
  7.  
  8.     function WhatOpenFont (wt: WindowType; item: integer): OSErr;
  9.     function WhatFlushFont (wt: WindowType; item: integer): OSErr;
  10.     function WhatClickFont (wt: WindowType; item: integer; er: eventRecord): OSErr;
  11.     function WhatClickFontSize (wt: WindowType; item: integer; er: eventRecord): OSErr;
  12.  
  13. implementation
  14.  
  15.     uses
  16.         Script, TextUtils, Fonts, Dialogs,TextEdit,
  17.  
  18.         ICTypes, ICStrH, 
  19.  
  20.         ICKeys, ICAPI, ICDialogs, ICMiscSubs, ICSubs, ICDocument {X}, ICMovableModal;
  21.  
  22.     procedure SetSizeOutlines (sizemenu: MenuHandle; font_num: integer);
  23.         var
  24.             tmpstr: Str255;
  25.             i: integer;
  26.             the_size: longint;
  27.     begin
  28.         for i := 1 to CountMItems(sizemenu) do begin
  29.             GetMenuItemText(sizemenu, i, tmpstr);
  30.             StringToNum(tmpstr, the_size);
  31.             if RealFont(font_num, the_size) then begin
  32.                 SetItemStyle(sizemenu, i, [outline]);
  33.             end else begin
  34.                 SetItemStyle(sizemenu, i, []);
  35.             end; (* if *)
  36.         end; (* for *)
  37.     end; (* SetSizeOutlines *)
  38.  
  39.     function FindMenuItem (mh: MenuHandle; item: Str255; var index: integer): boolean;
  40.         var
  41.             i: integer;
  42.             test_name: Str255;
  43.     begin
  44.         FindMenuItem := false;
  45.         for i := 1 to CountMItems(mh) do begin
  46.             GetMenuItemText(mh, i, test_name);
  47.             if IUEqualString(test_name, item) = 0 then begin
  48.                 index := i;
  49.                 FindMenuItem := true;
  50.             end; (* if *)
  51.         end; (* for *)
  52.     end;
  53.  
  54.     function ValidateSize (size: longInt): longInt;
  55.     begin
  56.         if (size > 0) and (size < 32767) then begin
  57.             ValidateSize := size;
  58.         end else begin
  59.             ValidateSize := GetDefFontSize;
  60.         end; (* if *)
  61.     end;
  62.  
  63.     function GetSizeMenuValue (dlg: DialogPtr; item: integer): longInt;
  64.         var
  65.             tmpstr: Str255;
  66.             tmpint: longint;
  67.             sizemenu: MenuHandle;
  68.     begin
  69.         sizemenu := GetPopupMHandle(dlg, item);
  70.         GetMenuItemText(sizemenu, GetDCtlValue(dlg, item), tmpstr);
  71.         StringToNum(tmpstr, tmpint);
  72.         GetSizeMenuValue := ValidateSize(tmpint);
  73.     end;
  74.  
  75.     procedure GetCurrentSetting (dlg: DialogPtr; item: integer; var font_setting: ICFontRecord; var font_num: integer);
  76.     begin
  77.         font_setting.face := [];
  78.         GetMenuItemText(GetPopupMHandle(dlg, item), GetDCtlValue(dlg, item), font_setting.font);
  79.         GetFNum(font_setting.font, font_num);
  80.         font_setting.size := GetSizeMenuValue(dlg, item + 1);
  81.     end;
  82.  
  83.     procedure DisplayFontProc (dlg: DialogPtr; item: integer);
  84.         var
  85.             font_setting: ICFontRecord;
  86.             saved: SavedWindowInfo;
  87.             font: integer;
  88.             r: rect;
  89.             s: str255;
  90.             name: Str255;
  91.     begin
  92.         SetPort(dlg);
  93.         GetCurrentSetting(dlg, item - 2, font_setting, font);
  94.         EnterWindow(dlg, font, font_setting.size, [], saved);
  95.         GetDItemRect(dlg, item, r);
  96.         PenPat(qd.gray);
  97.         FrameRect(r);
  98.         PenPat(qd.black);
  99.         GetFontName(font, name);
  100.         if (name = 'Chicago') & ((font_setting.size <> 12) | (item = 9)) then begin
  101.             s := GetIndStr(128, 16);
  102.         end else begin
  103.             s := GetIndStr(128, 14);
  104.         end; (* if *)
  105.         InsetRect(r, 3, 3);
  106.         TETextBox(@s[1], length(s), r, teJustLeft);
  107.         ExitWindow(saved);
  108.     end;
  109.  
  110.     function WhatOpenFont (wt: WindowType; item: integer): OSErr;
  111.         var
  112.             dlg: WindowPtr;
  113.             fontmenu: MenuHandle;
  114.             sizemenu: MenuHandle;
  115.             font_setting: ICFontRecord;
  116.             attr: longint;
  117.             i: integer;
  118.             count: longint;
  119.             font_num: integer;
  120.     begin
  121.         dlg := windowinfo[wt].window;
  122.         fontmenu := GetPopupMHandle(dlg, item);
  123.         count := sizeof(font_setting);
  124.         if (ICMapErr(ICGetPref(GetInstance, windowinfo[wt].items[item]^.key, attr, @font_setting, count)) <> noErr) | (count <> sizeof(font_setting)) then begin
  125.             GetFontName(GetAppFont, font_setting.font);
  126.             font_setting.face := [];
  127.             font_setting.size := GetDefFontSize;
  128.         end; (* if *)
  129.         ProcessAttributes(wt, item, attr);
  130.         GetFNum(font_setting.font, font_num);
  131.         if font_num = 0 then begin
  132.             GetFontName(GetAppFont, font_setting.font);
  133.             GetFNum(font_setting.font, font_num);
  134.         end; (* if *)
  135.         if FindMenuItem(fontmenu, font_setting.font, i) then begin
  136.             SetDCtlValue(dlg, item, i);
  137.         end;
  138.         sizemenu := GetPopupMHandle(dlg, item + 1);
  139.         if FindMenuItem(sizemenu, DecStr(font_setting.size), i) then begin
  140.             SetDCtlValue(dlg, item + 1, i);
  141.         end;
  142.         windowinfo[wt].items[item + 1]^.spare_data := ptr(longInt(font_setting.size));
  143.         SetSizeOutlines(sizemenu, font_num);
  144.         SetDCtlEnable(dlg, item, not IsLocked(wt, item));
  145.         SetDCtlEnable(dlg, item + 1, not IsLocked(wt, item));
  146.         SetDItemHandle(dlg, item + 2, handle(@DisplayFontProc));
  147.         WhatOpenFont := noErr;
  148.     end; (* WhatOpenFont *)
  149.  
  150.     function WhatClickFont (wt: WindowType; item: integer; er: eventRecord): OSErr;
  151.         var
  152.             dlg: DialogPtr;
  153.             font_setting: ICFontRecord;
  154.             font_num: integer;
  155.     begin
  156.         er := er; { Unused }
  157.         dlg := windowinfo[wt].window;
  158.         GetCurrentSetting(dlg, item, font_setting, font_num);
  159.         SetSizeOutlines(GetPopupMHandle(dlg, item + 1), font_num);
  160.         DisplayFontProc(dlg, item + 2);
  161.         WhatClickFont := noErr;
  162.     end;  (* WhatClickFont *)
  163.  
  164.     function MyModalFilter (dlg: DialogPtr; var er: EventRecord; var item: integer): boolean;
  165.         const
  166.             bs = chr(8);
  167.         var
  168.             ch: char;
  169.     begin
  170.         MyModalFilter := false;
  171.         if CancelModalFilter(dlg, er, item) then begin
  172.             MyModalFilter := true;
  173.         end else if (er.what = keyDown) or (er.what = autoKey) then begin
  174.             if BAND(er.modifiers, cmdKey) = 0 then begin
  175.                 ch := chr(BAND(er.message, $FF));
  176.                 if DirtyKey(ch) & not (ch in [bs, '0'..'9']) then begin
  177.                     SysBeep(1);
  178.                     er.what := nullEvent;
  179.                 end;
  180.             end;
  181.         end;
  182.     end;
  183.  
  184.     function GetOtherSize (var size: longInt): boolean;
  185.         var
  186.             dlg: DialogPtr;
  187.             item: integer;
  188.             s: Str255;
  189.             saved_state: Ptr;
  190.     begin
  191.         dlg := GetNewDialog(500, nil, POINTER(-1));
  192.         SetItemText(dlg, 4, DecStr(size));
  193.         SelectDialogItemText(dlg, 4, 0, 255);
  194.         SetUpDefaultOutline(dlg, 1, 3);
  195.         ShowWindow(dlg);
  196.         DisableMenuBar(saved_state, -1);
  197.         InitCursor;
  198.         repeat
  199.             MovableModalDialog(@MyModalFilter, item);
  200.         until item in [1, 2];
  201.         GetOtherSize := item = 1;
  202.         if item = 1 then begin
  203.             GetItemText(dlg, 4, s);
  204.             StringToNum(s, size);
  205.             size := ValidateSize(size);
  206.         end;
  207.         ReEnableMenuBar(saved_state);
  208.         DisposeDialog(dlg);
  209.     end;
  210.  
  211.     function WhatClickFontSize (wt: WindowType; item: integer; er: eventRecord): OSErr;
  212.         var
  213.             dlg: DialogPtr;
  214.             control: ControlHandle;
  215.             sizemenu: MenuHandle;
  216.             n: longInt;
  217.             tmpstr: Str255;
  218.             i: integer;
  219.             dummy: boolean;
  220.     begin
  221.         er := er; { Unused }
  222.         dlg := windowinfo[wt].window;
  223.         control := GetDControlHandle(dlg, item);
  224.         sizemenu := GetPopupMHandle(dlg, item);
  225.         if GetControlValue(control) = CountMItems(sizemenu) then begin
  226.             n := ord(windowinfo[wt].items[item]^.spare_data);
  227.             dummy := GetOtherSize(n);
  228.         end else begin
  229.             n := GetSizeMenuValue(dlg, item);
  230.         end;
  231.         if not TPbtst(sizemenu^^.enableFlags, 2) then begin { has initial strange number }
  232.             DeleteMenuItem(sizemenu, 1);
  233.             DeleteMenuItem(sizemenu, 1);
  234.         end;
  235.         windowinfo[wt].items[item]^.spare_data := Ptr(n);
  236.         NumToString(n, tmpstr);
  237.         if not FindMenuItem(sizemenu, tmpstr, i) then begin
  238.             InsertMenuItem(sizemenu, '(-;fred', 0);
  239.             SetMenuItemText(sizemenu, 1, tmpstr);
  240.             i := 1;
  241.         end;
  242.         SetControlMaximum(control, CountMItems(sizemenu));
  243.         SetControlValue(control, i);
  244.         DisplayFontProc(windowinfo[wt].window, item + 1);
  245.         WhatClickFontSize := noErr;
  246.     end;
  247.  
  248.     function WhatFlushFont (wt: WindowType; item: integer): OSErr;
  249.         var
  250.             dlg: DialogPtr;
  251.             err: OSErr;
  252.             font_setting: ICFontRecord;
  253.             old_font_setting: ICFontRecord;
  254.             attr: longint;
  255.             count: longint;
  256.             font: integer;
  257.     begin
  258.         dlg := windowinfo[wt].window;
  259.         GetCurrentSetting(dlg, item, font_setting, font);
  260.         (* get old values *)
  261.         count := sizeof(old_font_setting);
  262.         if (ICMapErr(ICGetPref(GetInstance, windowinfo[wt].items[item]^.key, attr, @old_font_setting, count)) <> noErr) | (count <> sizeof(old_font_setting)) then begin
  263.             old_font_setting.font := '';
  264.         end; (* if *)
  265.         (* write it back if changed *)
  266.         err := noErr;
  267.         if (old_font_setting.size <> font_setting.size) or (old_font_setting.face <> font_setting.face) or (IUEqualString(old_font_setting.font, font_setting.font) <> 0) then begin
  268.             if not IsLocked(wt, item) then begin
  269.                 err := ICMapErr(ICSetPref(GetInstance, windowinfo[wt].items[item]^.key, ICattr_no_change, @font_setting, sizeof(font_setting)));
  270.                 if err = noErr then begin
  271.                     DirtyDocument;
  272.                 end; (* if *)
  273.             end; (* if *)
  274.         end; (* if *)
  275.         WhatFlushFont := err;
  276.     end; (* WhatFlushFont *)
  277.  
  278. end. (* ICFontWhats *)
  279. AddResMenu(fontmenu, 'FONT');
  280. CalcMenuSize(fontmenu);
  281. SetControlMaximum(GetDControlHandle(dlg, item), CountMItems(fontmenu));
  282. DebugStr(String Of(fontmenu, CountMItems(fontmenu)));